grammar Indicator;

/*=======================
  语法规则 (Parser Rules)
 ========================*/

prog: (indicatorRule) + calculationRule EOF;

// 指标规则（支持不同括号类型）
indicatorRule
    : ID '->' interval '->' NUMBER NL
    ;

// 计算公式规则
calculationRule
    : '计算结果=' expr NL
    ;

// 表达式规则（支持变量、百分比、四则运算）
expr
    : expr ('*'|'/') expr       # MulDivExpr
    | expr ('+'|'-') expr       # AddSubExpr
    | ID '结果'                 # VarRef
    | NUMBER '%'               # PercentExpr
    | '(' expr ')'             # ParenExpr
    | NUMBER                   # Number
    ;

// 区间规则（支持四种括号组合）
interval
    : '[' left=rangePart ',' right=rangePart ']'   # ClosedClosedInterval  // [a,b]
    | '[' left=rangePart ',' right=rangePart ')'   # ClosedOpenInterval    // [a,b)
    | '(' left=rangePart ',' right=rangePart ']'   # OpenClosedInterval    // (a,b]
    | '(' left=rangePart ',' right=rangePart ')'   # OpenOpenInterval      // (a,b)
    | '[' '-' ',' '+' ']'                          # FullRangeInterval     // [-,+] 全范围
    ;

// 区间端点定义（数字、正无穷、负无穷）
rangePart
    : NUMBER  # NumberBound
    | '-'     # NegInfinity
    | '+'     # PosInfinity
    ;

/*=======================
  词法规则 (Lexer Rules)
 ========================*/

ID  : [\u4e00-\u9fa5a-zA-Z0-9_]+;  // 支持中文指标名
NUMBER: [0-9]+ ('.' [0-9]+)?;      // 整数或小数
NL  : '\r'? '\n';                  // 换行符
WS  : [ \t]+ -> skip;              // 忽略空格和Tab